package main

import (
	"fmt"
	"math/rand"
	"sort"
)

// 看下面一段程序，回答问题
// s1 := make([]int, 3, 4)
// s2 := append(s1, 1)
// 请问s1、s2内各有什么元素？
// s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
// s2再增加一个元素会怎么样？
func answer() {
	fmt.Println("s1是长度为3容量为4切片, 元素为: [0 0 0]")
	fmt.Println("s1是长度为4容量为4切片, 元素为: [0 0 0 1]")
	fmt.Println("s1修改一个元素会影响s2, s2修改一个元素会影响s1")
	fmt.Println("s2再增加一个元素会重新创建一个底层数组, 对s1无影响")
}

// 有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和
func sliceSum() {
	data := []int{1, 4, 9, 16, 2, 5, 10, 15}
	newSlice := make([]int, 0, len(data)-1)
	for i := 0; i < len(data)-1; i++ {
		newSlice = append(newSlice, data[i]+data[i+1])
	}
	fmt.Printf("新切片元素: %v\n", newSlice)
}

// 数字重复统计
func numRepeat(n int, l, r int) {
	m := make(map[int]int)
	for i := 0; i < n; i++ {
		randNum := rand.Intn(r-l) + l
		m[randNum]++
	}

	keys := make([]int, 0, len(m))
	for k := range m {
		keys = append(keys, k)
	}
	sort.Sort(sort.Reverse(sort.IntSlice(keys)))
	for _, v := range keys {
		fmt.Printf("降序输出 数字: %d 出现次数: %d\n", v, m[v])
	}
}

func main() {
	answer()
	sliceSum()
	numRepeat(100, -100, 100)
}

// 批改意见
// 1. s2的长度比s1大1，因此s2修改最后一个元素时对s1无影响
// 2. 第3题尝试在降序输出的同时，输出数字的重复次数
